home *** CD-ROM | disk | FTP | other *** search
/ Windows News 2010 Summer - Disc 1 / WN_Ete2010_CD1.iso / Onglet5 / Weezo / Weezo setup.exe / {code_appDir} / www / js / win-src.js < prev    next >
Text File  |  2010-05-19  |  44KB  |  1,141 lines

  1. var winMinW=150,winMinH=60;// Minimum window width & height
  2. var winSaveDelay=1000; // timeout between any window modification and position save request
  3. var winSaveTimer; // Timer used for saving windows positions
  4. var winInitialized=0;
  5. var winActive=false;
  6. var winEmptyHTML='';
  7. var seq=0;
  8. var winClosedPosition=new Array();
  9. var winScripts=true;
  10.  
  11. function winInit(){
  12.     if(!dd.ie && !dd.op) winMinH=200;
  13.     winInitialized=1;
  14. }
  15. function winCreate(windowId){
  16.     var p=winPadding,winHTML='';
  17.     var bw=dd.getWndW()-p.left-p.right
  18.     var bh=dd.getWndH()-p.top-p.bottom
  19.     var winDefaultW=2*bw/3;
  20.     var winDefaultH=2*bh/3;
  21.     var winDefaultX=p.left+bw/6+30*winList().length;
  22.     var winDefaultY=p.top+bh/6+30*winList().length;
  23.  
  24.     winDefaultW=Math.min(winDefaultW,1024);
  25.     winDefaultH=Math.min(winDefaultH,768);
  26.  
  27.     if(windowId=='winFake') {
  28.         winHTML='<div id="winFake" class="win" style="top:-200px; left:-200px; width:50px; height:50px; position:absolute;"><table class="winActive"><tr> <td class="winTH"><table><tr> <td class="winTL"></td> <td class="winT"><table><tr> <td class="winTT"></td></tr></table></td> <td class="winTR"></td></tr></table></td></tr><tr> <td><table><tr> <td class="winL"></td> <td class="winC"></td> <td class="winR"></td></tr><tr> <td class="winBL"></td> <td class="winB"></td> <td class="winBR"></td></tr></table></td></tr></table><div class="winClose"></div><div class="winMax"></div><div class="winMin"></div><div class="winReload"></div><div class="winReloading"></div><div class="winIcon"></div><div class="winCapt"></div></div>';
  29.         if(dd.op || dd.ie) dgi('winDock').outerHTML+=winHTML;
  30.         else{
  31.             var wDock = D.createElement("div");
  32.             var wIdAttr = D.createAttribute("id"); wIdAttr.nodeValue=windowId+"_wDock";wDock.setAttributeNode(wIdAttr);
  33.             dgi('winDock').appendChild(wDock);
  34.             wDock.innerHTML=winHTML;
  35.         }
  36.         return;
  37.     }
  38.     if(!winInitialized) winInit();
  39.     if(!dgi('winDock')) return false;
  40.     var now = new Date(),loadTs=Date.parse(now.toGMTString());
  41.  
  42.     if(!dgi(windowId)) winHTML+='<div id="'+windowId+'" class="win" style="top:'+winDefaultY+'px; left:'+winDefaultX+'px; width:'+winDefaultW+'px; height:'+winDefaultH+'px; padding:0px;position:absolute;visibility:hidden">';
  43.     winHTML+='<table id="'+windowId+'_table" class="winActive" cellpadding="0" cellspacing="0" style="width:100%;height:100%;">';
  44.     winHTML+='<tr class="winTTr"><td class="winTH">';
  45.         winHTML+='<table cellpadding="0" cellspacing="0" style="width:100%;height:100%;"><tr><td class="winTL" onmouseover="winHover(\''+windowId+'\',\'tl\')" onmouseout="winOut(\''+windowId+'\')"></td><td class="winT" onclick="win(\''+windowId+'\').bringToFront()" ondblclick="win(\''+windowId+'\').toggleState()"><table cellpadding="0" cellspacing="0" style="width:100%;height:100%;"><tr><td class="winTT" onmouseover="winHover(\''+windowId+'\',\'t\')" onmouseout="winOut(\''+windowId+'\')"></td></tr><tr><td style="line-height:1px"> </td></tr></table></td><td class="winTR" onmouseover="winHover(\''+windowId+'\',\'tr\')" onmouseout="winOut(\''+windowId+'\')"></td></tr></table>';
  46.     winHTML+='</td></tr><tr><td style="height:100%">';
  47.     winHTML+='<table cellpadding="0" cellspacing="0" style="height:100%;width:100%;"><tr><td class="winL" onmouseover="winHover(\''+windowId+'\',\'l\')" onmouseout="winOut(\''+windowId+'\')"></td><td class="winC">';
  48.     winHTML+='<div id="'+windowId+'_oif" class="winOIF">'; /* iFrame container */
  49.     /* IFRAME */
  50.     winHTML+='<iframe id="'+windowId+'_if" name="'+windowId+'_if'+Date.parse(now.toGMTString())+'" frameborder="0" class="winIF" src="'+((W.location.protocol=='https:')?'https://'+W.location.hostname+'/ping.php?check=1':'')+'" onload="if(win(\''+windowId+'\')) win(\''+windowId+'\').setLoaded()" onmouseover="win(\''+windowId+'\').mouseIn()" onmouseout="try{frames[this.name].winMouseOut()} catch(err){}"></iframe>';
  51.     if(!dd.ie) winHTML+='<div id="'+windowId+'_mask" class="winMask" style="display:none;'+((dd.op)?'width:100%;height:3px;':'width:100%;height:100%')+'" onmouseover="win(\''+windowId+'\').maskHover()" onclick="win(\''+windowId+'\').activate()"> </div>';
  52.     winHTML+='</div>';
  53.  
  54.     winHTML+='</td><td class="winR" onmouseover="winHover(\''+windowId+'\',\'r\')" onmouseout="winOut(\''+windowId+'\')"></td></tr>';
  55.     winHTML+='<tr class="winBTr"><td class="winBL" onmouseover="winHover(\''+windowId+'\',\'bl\')" onmouseout="winOut(\''+windowId+'\')"></td><td class="winB" onmouseover="winHover(\''+windowId+'\',\'b\')" onmouseout="winOut(\''+windowId+'\')"></td><td class="winBR" onmouseover="winHover(\''+windowId+'\',\'br\')" onmouseout="winOut(\''+windowId+'\')"></td></tr></table>'
  56.     winHTML+='</td></tr></table>';
  57.     var aH='<a href="javascript:void(0)" class="';
  58.     winHTML+=aH+'winClose" onclick="win(\''+windowId+'\').closeMe()" id="'+windowId+'_close"></a>';
  59.     winHTML+=aH+'winMax" onclick="win(\''+windowId+'\').toggleState()" id="'+windowId+'_toggle"></a>';
  60.     winHTML+=aH+'winReloading" onclick="win(\''+windowId+'\').reload()" id="'+windowId+'_reload"></a>';
  61.     winHTML+=aH+'winMin" onclick="win(\''+windowId+'\').minimize()" id="'+windowId+'_min"></a>';
  62.     winHTML+=aH+'winTNW" onclick="win(\''+windowId+'\').toNewWin()" id="'+windowId+'_tnw"></a>';
  63.     winHTML+=aH+'winExtra" id="'+windowId+'_extra" style="display:none"></a>';
  64.     winHTML+='<div class="winIcon" id="'+windowId+'_icon" onclick="win(\''+windowId+'\').sendToBack()" ondblclick="win(\''+windowId+'\').closeMe()"></div>';
  65.     winHTML+='<div class="winARI" id="'+windowId+'_ARI"> </div>';
  66.  
  67.     winHTML+='<div style="display:none">';
  68.     winHTML+='<div id="'+windowId+'_reloadSrc"></div>';
  69.     winHTML+='<div id="'+windowId+'_reloadType"></div>';
  70.     winHTML+='<div id="'+windowId+'_openerId"></div>';
  71.     winHTML+='<div id="'+windowId+'_closeFunction"></div>';
  72.     winHTML+='</div>';
  73.  
  74.     winHTML+='<div class="winCapt" id="'+windowId+'_capt" ondblclick="win(\''+windowId+'\').toggleState()"></div>';
  75.     if(dd.ie) winHTML+='<div id="'+windowId+'_mask" class="winMask" style="display:none;width:30px;height:30px;" onmouseover="win(\''+windowId+'\').maskHover()" onclick="win(\''+windowId+'\').activate()"> </div>';
  76.     if(!dgi(windowId)) winHTML+='</div>';
  77. /*
  78.     if(dd.op || dd.ie) dgi('winDock').outerHTML+=winHTML;
  79.     else{*/
  80.         if(dgi(windowId)){
  81.             dgi(windowId).innerHTML=winHTML;
  82.         }
  83.         else{
  84.             var wDock = D.createElement("div");
  85.             var wIdAttr = D.createAttribute("id"); wIdAttr.nodeValue=windowId+"_wDock";wDock.setAttributeNode(wIdAttr);
  86.             dgi('winDock').appendChild(wDock);
  87.             wDock.innerHTML=winHTML;
  88.         }
  89.     //}
  90.     ADD_DHTML(windowId+ISWINDOW+RESIZABLE+INERTIA);
  91.     if(winEmptyHTML){winIF(windowId).document.write(winEmptyHTML);}
  92.  
  93.     if(!dd.ie) dgi(windowId+"_mask").style.top="0";
  94.     if(!dd.ie) dgi(windowId+"_mask").style.left="0";
  95.  
  96.     dgi(windowId+'_close').title=winCaptionClose;
  97.     dgi(windowId+'_toggle').title=winCaptionMaximize;
  98.     dgi(windowId+'_min').title=winCaptionMinimize;
  99.     dgi(windowId+'_tnw').title=winCaptionTNW;
  100.  
  101.     dgi(windowId+'_reload').title=winCaptionReload;
  102.  
  103.     return win(windowId);
  104. }
  105. /**
  106.  * Open a window
  107.  * locationUrl: target URL
  108.  * windowId: id of created window
  109.  * windowLable: label (title) of created window
  110.  * openerId: id of opener window
  111.  */
  112. function winOpenLocation(locationUrl, windowId, windowLabel, openerId){
  113.     if(dgi(windowId) && dgi(windowId).innerHTML.length>0){
  114.         dgi(windowId).style.display=="none"; dgi(windowId).style.display="block";
  115.         if(openerId) win(windowId).setOpenerId(openerId);
  116.         if(W.winMonitor) W.winMonitor(win(windowId),'open');
  117.         //win(windowId).setWinState('normal');
  118.         win(windowId).activate();
  119.         return 'activated';
  120.     }
  121.     with(w=winCreate(windowId)){
  122.         setCaption(windowLabel);
  123.         activate();
  124.         setIcon("/gfx/logoSmall.png");
  125.         setSrc(locationUrl);
  126.         setReloadSrc(locationUrl);
  127.         if(openerId) setOpenerId(openerId);
  128.     }
  129.     if(W.winMonitor) W.winMonitor(w,'open');
  130.     return 'created';
  131. }
  132. function winSavePosition(){
  133.     var GETStr="winUpdate=true";
  134.     var nb=0;
  135.     var wo;
  136.     if(winActive) GETStr+="&winActive="+winActive;
  137.     for(var i=0; i<dd.elements.length; i++){
  138.         if(dd.elements[i].isIcon){
  139.             GETStr+="&name_"+nb+"="+dd.elements[i].name;
  140.             GETStr+="&type_"+nb+"=icon";
  141.             GETStr+="&x_"+nb+"="+dd.elements[i].x;
  142.             GETStr+="&y_"+nb+"="+dd.elements[i].y;
  143.             nb++;
  144.         }
  145.         if(dd.elements[i].isWindow){
  146.             if(dgi(dd.elements[i].name+"_reloadSrc").innerHTML.length>0){
  147.                 wo=win(dd.elements[i].name);
  148.                 GETStr+="&name_"+nb+"="+wo.id;
  149.                 GETStr+="&type_"+nb+"=win";
  150.                 GETStr+="&src_"+nb+"="+encodeURIComponent(dgi(dd.elements[i].name+"_reloadSrc").innerHTML);
  151.                 GETStr+="&icon_"+nb+"="+encodeURIComponent(dgi(dd.elements[i].name+"_icon").innerHTML);
  152.                 if(wo.getCaption().length>0) GETStr+="&capt_"+nb+"="+encodeURIComponent(wo.getCaption());
  153.                 GETStr+="&reloadable_"+nb+"="+wo.reloadable();
  154.                 GETStr+="&resizable_"+nb+"="+wo.resizable();
  155.                 GETStr+="&closeable_"+nb+"="+wo.closeable();
  156.                 if(dd.elements[i].noDrag) GETStr+="&noDrag_"+nb+"=true";
  157.                 GETStr+="&winState_"+nb+"="+dd.elements[i].winState;
  158.                 if(dd.elements[i].winState=="normal"){
  159.                     GETStr+="&x_"+nb+"="+dd.elements[i].x;
  160.                     GETStr+="&y_"+nb+"="+dd.elements[i].y;
  161.                     GETStr+="&w_"+nb+"="+dd.elements[i].w;
  162.                     GETStr+="&h_"+nb+"="+dd.elements[i].h;
  163.                 }
  164.                 else{
  165.                     GETStr+="&x_"+nb+"="+((dd.elements[i].prevX)?dd.elements[i].prevX:dd.elements[i].x);
  166.                     GETStr+="&y_"+nb+"="+((dd.elements[i].prevY)?dd.elements[i].prevY:dd.elements[i].y);
  167.                     GETStr+="&w_"+nb+"="+((dd.elements[i].prevW)?dd.elements[i].prevW:dd.elements[i].w);
  168.                     GETStr+="&h_"+nb+"="+((dd.elements[i].prevH)?dd.elements[i].prevH:dd.elements[i].h);
  169.                 }
  170.                 nb++;
  171.             }
  172.         }
  173.     }
  174.     clearTimeout(winSaveTimer);
  175.     sendData(GETStr,scriptLocation,false);
  176. }
  177. // Return iframe's frame
  178. // objId may be windows id, window object, or any window's child
  179. function winIF(objId){
  180.     if(typeof objId=='string') return frames[dgi(objId+"_if").name];
  181.     if(dgi(objId.id+"_if"))    return frames[dgi(objId.id+"_if").name];
  182.     while(!objId.id || !dgi(objId.id+"_if")) {
  183.         if((objId.id && objId.id=='winDock')||!objId.parentNode||objId==objId.parentNode) return;
  184.         objId=objId.parentNode;
  185.     }
  186.     return frames[dgi(objId.id+"_if").name];
  187. }
  188.  
  189.  
  190. /**
  191.  * Restore position of icons and windows on mainFrame load
  192.  * @param posArr: array of icons and windows
  193.  */
  194. function winRestorePosition(posArr){
  195.     var displayedWin=0,tmpStr,p;
  196.     var maxW=((W.innerWidth)?W.innerWidth:D.body.offsetWidth)-winPadding['left']-winPadding['right'];
  197.     var maxH=((W.innerHeight)?W.innerHeight:D.body.offsetHeight)-winPadding['top']-winPadding['bottom'];
  198.     zindx=600;
  199.     for(var i=0; i<posArr.length;i++){
  200.         p=posArr[i];
  201.         if(p['type']=='win' && !dgi(p["name"])){
  202.             with(dWin=winCreate(p["name"])){
  203.                 p["src"]=p["src"].replace(/&/gi,"&");
  204.                 if(p["src"].search(/rnd=/)>0){
  205.                     tmpStr=p["src"].substr(0,p["src"].search(/rnd=/)+4);
  206.                     p["src"]=p["src"].substr(p["src"].search(/rnd=/)+4);
  207.                     if(p["src"].search(/&/)>-1) p["src"]=p["src"].substr(p["src"].search(/&/)); else p["src"]="";
  208.                     p["src"]=tmpStr+Math.random()+p["src"];
  209.                 }
  210.                 setSrc(p["src"]);
  211.                 setReloadSrc(p["src"].replace(/&/gi,"&"));
  212.                 if(p["capt"]) setCaption(p["capt"]);
  213.                 if(p["icon"]) setRawIcon(p["icon"]);
  214.  
  215.                 p["w"]=Math.min(p["w"],maxW); p['x']=Math.min(p['x'],maxW-p['w']);
  216.                 p["h"]=Math.min(p["h"],maxH); p['y']=Math.min(p['y'],maxW-p['h']);
  217.                 moveTo(winPadding['left']+p["x"],winPadding['top']+p["y"]);
  218.                 resizeTo(p["w"],p["h"]);
  219.  
  220.                 if(p["winState"]=="normal"){} else maximize({'noAnimation':1});
  221.  
  222.                 if(W.winMonitor) W.winMonitor(dWin,'open');
  223.  
  224.                 showMask();
  225.                 show({'noAnimation':1});
  226.                 bringToFront();
  227.  
  228.                 if(p["active"]) winActive=p["name"];
  229.                 displayedWin++;
  230.             }
  231.         }
  232.     }
  233.     if(winActive) win(winActive).activate();
  234.     if(!displayedWin) winCreate('winFake');
  235. }
  236.  
  237. function winLayoutModified(){
  238.     if(winSaveTimer) clearTimeout(winSaveTimer);
  239.     winSaveTimer=setTimeout("winSavePosition()", winSaveDelay);
  240. }
  241.  
  242. /**
  243. * Restore icons position, and generate shadowed caption
  244. */
  245. function iconRestorePosition(){
  246.      var posX=20,posY=20,iconId,i,o,p,nbCar,maxWidth,separator=' ,.;:/_\'"&@-(){}[]?',line1,line2,txt,cut,cn,cnc,zindx=500,c;
  247.      var sh={'t':new Array(-1,0),'b':new Array(1,0),'l':new Array(0,-1),'r':new Array(0,1),'br':new Array(1,1)};
  248.  
  249.      for(i=0; i<D.getElementsByTagName("div").length;i++) if((c=D.getElementsByTagName("div")[i]) && c.id.substr(0,8)=="resIcon_"){
  250.          iconId=D.getElementsByTagName("div")[i].id.substr(8);
  251.  
  252.          // Set Z-Index to 500+
  253.          c.style.zIndex=zindx++;
  254.  
  255.          // Truncate caption
  256.          cn=dgi('iconCaption_'+iconId);
  257.          cnc=dgi('iconCaption_'+iconId+'_cont');
  258.          txt=cn.innerHTML;
  259.  
  260.          nbCar=txt.length;
  261.          p=0;
  262.          maxWidth=dgi('resIcon_'+iconId).offsetWidth;
  263.          if(nbCar>9){
  264.              for(o=0;o<nbCar && o<10;o++){
  265.                  if(separator.indexOf(txt.substr(o,1))!=-1) p=o;
  266.              }
  267.              cn.innerHTML=txt.substr(0,o).replace(/ /gi,' ');
  268.              while(o < nbCar && (cn.offsetWidth + 6) < maxWidth){
  269.                  o++;
  270.                  if(separator.indexOf(txt.substr(o,1))!=-1) p=o;
  271.                  cn.innerHTML=txt.substr(0,o).replace(/ /gi,' ');
  272.              }
  273.              if(o==nbCar){
  274.                  line1=txt;
  275.                  txt='';
  276.              }
  277.              else{
  278.                  if(p>0) {
  279.                      line1=txt.substr(0,p);
  280.                      txt=txt.substr(p);
  281.                  }
  282.                  else{
  283.                      line1=txt.substr(0,o);
  284.                      txt=txt.substr(o);
  285.                  }
  286.              }
  287.          }
  288.          else{
  289.              line1=txt;
  290.              txt='';
  291.          }
  292.          if(txt.length>0 && txt.substr(0,1)==' ') txt=txt.substr(1);
  293.             nbCar=txt.length; cut=false;
  294.             cn.innerHTML=txt.replace(/ /g,' ');
  295.         while(nbCar > 3 && cn.offsetWidth + 6 > maxWidth){
  296.             txt=txt.substr(0,nbCar--);
  297.             cn.innerHTML=txt.replace(/ /g,' ')+"...";
  298.             cut=true;
  299.         }
  300.         txt=line1.replace(/ /g,' ')+'<br>'+txt.replace(/ /g,' ')+(cut?'...':'');
  301.         cn.innerHTML=txt;
  302.  
  303.         // Insert caption in shadow spans
  304.         cont='';
  305.         for(o in sh){
  306.             cont+='<span id="iconCaption_'+iconId+'_'+o+'" class="iconCS" style="top:'+sh[o][0]+'px;left:'+sh[o][1]+'px'+((txt.length==0)?';padding-top:0.5em':'')+'">'+txt+'</span>';
  307.         }
  308.         if(txt.length==0) cn.style.paddingTop="0.5em";
  309.         if(line1.length==0) dgi('resIcon_'+iconId+'_img').style.marginTop="5px";
  310.         cnc.style.left=dgi('resIcon_'+iconId).offsetWidth/2-cn.offsetWidth/2;
  311.         cn.style.left=dgi('resIcon_'+iconId).offsetWidth/2-cn.offsetWidth/2;
  312.         cnc.innerHTML=cont;
  313.         cn.className='iconC';
  314.  
  315.         if(!dgi('noDrag_'+iconId)) ADD_DHTML("resIcon_"+iconId+ISICON+RESET_Z+INERTIA);
  316.      }
  317.      iconAdjustIcons();
  318. }
  319.  
  320. /**
  321.  * Readjust all icons position so icons don't overlap
  322.  * Called on page load and on resize
  323.  */
  324. function iconAdjustIcons(){
  325.      var posX=20,posY=20,o=0,s,iid=[],x=[], y=[],ok,n;
  326.      var wp=winPadding,w=dd.getWndW(),h=dd.getWndH(),t=wp.top,l=wp.left;
  327.      if(!W.iconsList) return;
  328.      for(i=0; i<iconsList.length;i++) {
  329.         iid[i]='resIcon_'+iconsList[i][0];
  330.         s=dgi(iid[i]).style;
  331.         x[i]=s.left.replace(/px/,'')*1.0;
  332.         y[i]=s.top.replace(/px/,'')*1.0;
  333.      }
  334.      for(i=0; i<iid.length;i++) {
  335.          if(x[i]+iconWidth > w-wp.right || y[i]+iconHeight > h-wp.bottom || x[i]<l || y[i]<t){
  336.              ok=0;
  337.              while(!ok){
  338.                  x[i]=posX; y[i]=posY;
  339.                  posY+=iconHeight;
  340.                 if(posY+iconHeight > h-wp.bottom){posY=20;posX+=iconWidth;}
  341.                  ok=1;
  342.                  for(o=0;o<x.length;o++){
  343.                      if(o!=i && Math.abs(x[i]-x[o])<(iconWidth/2) && Math.abs(y[i]-y[o])<(iconHeight/2)){
  344.                          ok=0;
  345.                          o=x.length;
  346.                      }
  347.                  }
  348.              }
  349.              n=dd.elements[iid[i]];
  350.              n.moveTo(x[i],y[i]); n.defx=x[i]; n.defy=y[i];
  351.          }
  352.      }
  353. }
  354.  
  355. function winHover(winId,rDir){
  356.     if(dd.obj || dgi(winId).className=='winNR') return;
  357.     dd.elements[winId].resizeDir=rDir;
  358.     dd.elements[winId].resizeIfPick=true;
  359.  
  360. }
  361. function winOut(winId){
  362.     if(dd.obj||!dd.elements[winId]) return;
  363.     dd.elements[winId].resizeDir="";
  364.     dd.elements[winId].resizeIfPick=false;
  365.  
  366. }
  367. // Mouse over iframe
  368. winObj.prototype.mouseIn = function (){try{if(winIF(this).winMouseIn) winIF(this).winMouseIn()} catch(err){}}
  369.  
  370. // Mouse out of iframe
  371. winObj.prototype.mouseOut = function (){try{winIF(this).winMouseOut()} catch(err){}}
  372.  
  373. function winCloseAll(){
  374.     var f, didClose=true;
  375.     if(D.getElementsByTagName("iframe").length==0) return;
  376.     while(didClose){
  377.         didClose=false;
  378.         for(var i=0; i<D.getElementsByTagName("iframe").length; i++){
  379.             f=D.getElementsByTagName("iframe")[i];
  380.             if(frames[f.id].winMyId) {win(f.id.substr(0,f.id.length-3)).closeMe(); didClose=true;}
  381.         }
  382.     }
  383. }
  384. function winAdjustWindows(){
  385.     winAdjustMaximized();
  386.     if(!dd.getWndW()||!dd.getWndH()) return; // Don't resize if browser minimized
  387.     var winObj;
  388.     for(var i=0; i<dd.elements.length; i++){
  389.         winObj=dd.elements[i];
  390.         if(winObj.isWindow && winObj.winState!='max'){
  391.             if (winObj.x+winObj.w > dd.getWndW()){
  392.                 if(winObj.w > dd.getWndW()) winObj.resizeTo(dd.getWndW(), winObj.h);
  393.                 else winObj.moveTo(dd.getWndW()-winObj.w,winObj.y)
  394.             }
  395.             if (winObj.y+winObj.h > dd.getWndH()){
  396.                 if(winObj.h > dd.getWndH()) winObj.resizeTo(winObj.w, dd.getWndH());
  397.                 else winObj.moveTo(winObj.x, dd.getWndH()-winObj.h)
  398.             }
  399.         }
  400.     }
  401. }
  402. function winAdjustMaximized(){
  403.     for(var i=0; i<dd.elements.length; i++){
  404.         if(dd.elements[i].isWindow && dd.elements[i].winState=='max')    dd.elements[i].resizeTo(dd.getWndW(),dd.getWndH());
  405.     }
  406. }
  407. function winPicked(){}
  408. function winDropped() {
  409.     win(dd.obj.name).hideMask();
  410.     dd.obj.resizeIfPick=false;
  411.     win(dd.obj.name).activate();
  412.     winLayoutModified();
  413. }
  414. function iconDropped() {winLayoutModified();}
  415.  
  416. function winDebug(message,lineBreak){
  417.     if(!dgi('winDebug')) {
  418.         w=winCreate('winDebug',true);
  419.         w.setCaption('DEBUG');
  420.         w.show();
  421.         w.bringToFront();
  422.         w.moveTo(3*dd.getWndW()/4, 0);
  423.         w.resizeTo(dd.getWndW()/4, dd.getWndH());
  424.         w.setLoaded();
  425.         if(W.winMonitor) W.winMonitor(w,'open');
  426.         winIF("winDebug").document.body.innerHTML='';
  427.         winIF("winDebug").stop();
  428.     }
  429.     if(!message) message='<empty>';
  430.     var tmp=winIF("winDebug").document.body.innerHTML;
  431.     winIF("winDebug").document.body.innerHTML='';
  432.     message=""+message;
  433.     winIF("winDebug").document.write('<body style="background:white">'+message.replace(/</g,'<')+(lineBreak==undefined?'<br>':'')+tmp);
  434. }
  435.  
  436. /**
  437.  * win Class
  438.  */
  439. function winObj(winId){
  440.     if(dgi(winId)) {
  441.         this.elt=dgi(winId);
  442.         this.id=winId;
  443.     }
  444.     else{
  445.         this.elt=false;
  446.         this.id=false;
  447.     }
  448.     this.fixedSize=false;
  449. }
  450. function win(winId){
  451.     if(!dgi(winId)) winId="winFake";
  452.     //if(!dgi(winId)) return false;
  453.     var wo=new winObj(winId);
  454.     return wo;
  455. }
  456. function winSetChildsIds(){
  457.     for(var i=0; i<winList().length; i++){
  458.         if(winIF(winList(i).id).winMyId && winIF(winList(i).id).winMyId==-1) {
  459.                 winIF(winList(i).id).winMyId=winList(i).id;
  460.                 winIF(winList(i).id).winMe=new winObj(winList(i).id);
  461.             }
  462.     }
  463.     return;
  464. }
  465. function winList(itemNb){
  466.     var wins=new Array();
  467.     nb=0;
  468.     for(var i=0; i<dd.elements.length; i++){
  469.         if(dd.elements[i].isWindow) wins[nb++]=win(dd.elements[i].name);
  470.     }
  471.     if((itemNb || itemNb===0) && itemNb<nb) return wins[itemNb];
  472.     return wins;
  473. }
  474.  
  475. winObj.prototype.maskHover = function (){if(!dd.obj && winActive==this.id) win(this.id).hideMask();}
  476. winObj.prototype.showMask = function (){dgi(this.id+"_mask").style.display="block";this.resizeMask();}
  477. winObj.prototype.hideMask = function (){dgi(this.id+"_mask").style.display="none";}
  478.  
  479. // Resize div mask over iframe and caption div
  480. winObj.prototype.resizeMask = function (){
  481.     var i=0,caption=dgi(this.id+'_capt'),w=999,icons=['_close','_toggle','_reload','_tnw','_min','_extra'],it;
  482.  
  483.     // Resize div mask over iframe
  484.     if(dd.ie) dgi(this.id+"_mask").style.width=dgi(this.id+"_if").offsetWidth + "px";
  485.     if(dd.ie || dd.op) dgi(this.id+"_mask").style.height=dgi(this.id+"_if").offsetHeight + "px";
  486.     // Resize caption
  487.     for(;i<icons.length;i++) {
  488.         it=dgi(this.id+icons[i]);
  489.         if(it.style.display!='none') w-=Math.max(w-it.offsetLeft,0);
  490.     }
  491.     caption.style.width=Math.max(1,w-caption.offsetLeft)+'px'
  492. }
  493.  
  494.  
  495. // Move/resize
  496.  
  497. // Get desktop area width and height
  498. winObj.prototype.desktopSize = function (){return {'w':dd.getWndW(),'h':dd.getWndH()};}
  499. function resizeComplete(){win(dd.obj.name).resized();}
  500. // Resize a window
  501. winObj.prototype.resized = function (){
  502.     try{if(winIF(this).winResized) winIF(this).winResized(dgi(this.id+"_if").offsetWidth,dgi(this.id+"_if").offsetHeight);} catch(err){}
  503.     winLayoutModified();
  504. }
  505.  
  506. /**
  507.  * Resise window
  508.  * @param w: new outer width
  509.  * @param h: new outer heigh
  510.  * @param centerResize: true to keep window centered on actual position, false to keep top left corner position constant
  511.  * @param fastAnim: set to true not apply layout modification and not to apply in-window resize (ie. set when animating window)
  512.  */
  513. winObj.prototype.resizeTo = function (w,h,centerResize,fastAnim){
  514.     w=Math.min(this.desktopSize()['w'],w);
  515.     h=Math.min(this.desktopSize()['h'],h);
  516.     if(!w) w=false;if(!h) h=false;
  517.     if(centerResize) dd.elements[this.id].moveBy(w?(dd.elements[this.id].w-w)/2:0,h?(dd.elements[this.id].h-h)/2:0);
  518.     dd.elements[this.id].resizeTo(w,h);
  519.     this.resizeMask();
  520.     if(!fastAnim) this.resized();
  521. }
  522.  
  523. /**
  524.  * Resize window to a given percentage of desktop area
  525.  * see resizeTo for parameters description
  526.  */
  527. winObj.prototype.resizeToRelative = function (pw,ph,centerResize,fastAnim){
  528.     this.resizeTo(dd.getWndW()*pw/100,dd.getWndH()*ph/100,centerResize,fastAnim);
  529. }
  530.  
  531.  
  532. /**
  533.  * Resize inner part window (iframe)
  534.  * see resizeTo for parameters description
  535.  */
  536. winObj.prototype.resizeInnerTo = function (w,h,centerResize,fastAnim){
  537.     // If window is being animated, inner frames have fixed size and may prevent innerWidth to be calculated correctly
  538.     if(this.iframe().parentNode.style.width!='100%'){
  539.         // Reset iframe and it's outer wrapping sizes
  540.         var iFS=this.iframe().style,oiFS=this.iframe().parentNode.style;
  541.         iFS.width=iFS.height=oiFS.width=oiFS.height='100%';
  542.     }
  543.     this.resizeTo((w)?w+this.getOuterWidth()-this.getInnerWidth():false,(h)?h+this.getOuterHeight()-this.getInnerHeight():false,centerResize,fastAnim);
  544. }
  545.  
  546. winObj.prototype.moveBy = function (x,y,fastAnim){dd.elements[this.id].moveBy(x,y);if(!fastAnim) winLayoutModified();}
  547. winObj.prototype.moveTo = function (x,y,fastAnim){dd.elements[this.id].moveTo(x,y);if(!fastAnim) winLayoutModified();}
  548.  
  549. // Get X & Y positions
  550. winObj.prototype.getX = function (){return dd.elements[this.id].x}
  551. winObj.prototype.getY = function (){return dd.elements[this.id].y}
  552.  
  553. // Get window inner width & height
  554. winObj.prototype.getInnerWidth = function (){if(dgi(this.id+"_if")) return dgi(this.id+"_if").offsetWidth;return 100;}
  555. winObj.prototype.getInnerHeight = function (){if(dgi(this.id+"_if")) return dgi(this.id+"_if").offsetHeight;return 100;}
  556.  
  557. // Get window outer width & height
  558. winObj.prototype.getOuterWidth = function (){return dgi(this.id).offsetWidth}
  559. winObj.prototype.getOuterHeight = function (){return dgi(this.id).offsetHeight}
  560.  
  561. // Close
  562. winObj.prototype.closeMe = function (){
  563.     var n=dgi(this.id+"_close");
  564.  
  565.     if(!n||n.className=="winCloseD") return;
  566.     winClosedPosition[this.id]=new Array(dd.elements[this.id].x, dd.elements[this.id].y, dd.elements[this.id].w, dd.elements[this.id].h);
  567.     // Stop/abort iframe's connections
  568.     try{winIF(this).windowStop();} catch(e){};
  569.  
  570.     // Resource has an onClose function
  571.     if(this.getCloseFunction()) try{eval('winIF(this).'+this.getCloseFunction()+'()');} catch(err){};
  572.  
  573.     // FF neverending loading workaround
  574.     if(W.phpBrowser && phpBrowser=='gecko') ffLoadWA();
  575.     //winIF(this).src='';
  576.  
  577.     // If animate window, fade out
  578.     if(windowsAnimation) this.popOut({},'winObjProceedClose("'+this.id+'")');
  579.     // Else, directly proceed to window destruction
  580.     else winObjProceedClose(this.id);
  581. }
  582.  
  583. function winObjProceedClose(winId){
  584.     if(W.winMonitor && dgi(winId).innerHTML!="") W.winMonitor(win(winId),'close');
  585.     if(dd.elements[winId]) dd.elements[winId].del();
  586.     if(phpBrowser!='ie') dgi(winId).innerHTML='';
  587.     removeNode(dgi(winId));
  588.  
  589.     // Activate next window
  590.     for(var i=winList().length-1;i>=0;i--){
  591.         if (winList(i).state().substr(0,3)!='min'){
  592.             winList(i).activate();
  593.             break;
  594.         }
  595.     }
  596.     winLayoutModified();
  597. }
  598.  
  599. // Load/reload
  600. winObj.prototype.setLoaded = function (){
  601.     var n;
  602.     // IE everending loading bug workaround
  603.     if(phpBrowser=='ie') {n=D.createElement('iframe'); n.style.display='none'; D.body.appendChild(n);}
  604.     if(!(n=dgi(this.id+"_reload"))) return;
  605.     if(n.style.cursor=="") n.className="winReload"; else n.className="winReloadD";
  606. }
  607. winObj.prototype.setReloading = function (){if(n=dgi(this.id+"_reload")) n.className="winReloading";}
  608. winObj.prototype.reload = function (){
  609.     try{if(winIF(this).winPreReload) if(!winIF(this).winPreReload()) return;} catch(err){}
  610.  
  611.     if(this.id=='winDebug') return winIF("winDebug_if").document.body.innerHTML='';
  612.     if(dgi(this.id+"_reload").className=="winReloadD") return;
  613.     dgi(this.id+"_reload").className="winReloading";
  614.     if(dgi(this.id+"_reloadType").innerHTML=='POST'){
  615.         winIF(this).location.reload();
  616.     }
  617.     else{
  618.         dgi('reloadForm').a.value=Math.random(999999);
  619.         dgi('reloadForm').action=winIF(this).location;
  620.         dgi('reloadForm').target = dgi(this.id+"_if").name;
  621.         dgi('reloadForm').submit();
  622.     }
  623. }
  624. winObj.prototype.goURL= function (URL){winIF(this).document.src=URL}
  625.  
  626. winObj.prototype.setReloadType = function (rT){if(n=dgi(this.id+"_reloadType")) n.innerHTML=rT;}
  627. // Show / hide asynchronous reload indicator
  628. winObj.prototype.asyncRequestIndicator = function (s){if(n=dgi(this.id+"_ARI")){n.style.display=(s)?'':'none';n.style.visibility='visible'}}
  629.  
  630.  
  631. // Maximize/restore/size/move
  632. winObj.prototype.maximize = function (options){
  633.     if(!options) options={};
  634.     var dWin=dd.elements[this.id];
  635.     prevState=dWin.winState;
  636.     if(dWin.winState!='max') dWin.prevX=dWin.x;dWin.prevY=dWin.y;dWin.prevW=dWin.w;dWin.prevH=dWin.h;
  637.     dWin.nodrag=true;
  638.     this.resizeMask();
  639.     if(dgi(this.id).className!="winNB") dgi(this.id).className="winNR";
  640.     dgi(this.id+"_toggle").className="winRestore";
  641.     dgi(this.id+"_toggle").title=winCaptionRestore;
  642.     dWin.winState='max';
  643.     if(W.winMonitor) W.winMonitor(this,'maximize');
  644.     try{if(winIF(this).winStateChanged) winIF(this).winStateChanged(prevState,'max');} catch(err){}
  645.  
  646.     // Animate window
  647.     if(windowsAnimation && !options['noAnimation']) {
  648.         this.popIn({'destX':winPadding.left,'destY':winPadding.top,'destW':dd.getWndW()-winPadding.left-winPadding.right,'destH':dd.getWndH()-winPadding.top-winPadding.bottom})
  649.     }
  650.     // Or just resize it
  651.     else{
  652.         dWin.moveTo(winPadding.left,winPadding.top);
  653.         dWin.resizeTo(dd.getWndW()-winPadding.left-winPadding.right,dd.getWndH()-winPadding.top-winPadding.bottom);
  654.     }
  655.  
  656. }
  657. winObj.prototype.restore = function (){
  658.     var dWin=dd.elements[this.id],x,y,w,h,ww=dd.getWndW(),wh=dd.getWndH(),p=winPadding;
  659.     prevState=dWin.winState;
  660.  
  661.     // Restore from minimized
  662.     if(dWin.winState=='minMax' || dWin.winState=='minNormal') {
  663.         // Restore previous position
  664.         if(dWin.prevX!==undefined){this.moveTo(dWin.prevX,dWin.prevY);this.resizeTo(dWin.prevW,dWin.prevH);}
  665.  
  666.         // Show window
  667.         if(windowsAnimation) {
  668.             // Compute animation x,y target
  669.             x=((p.right>0)?dd.getWndW()-p.right:p.left);
  670.             y=((p.bottom>0)?dd.getWndH()-p.bottom:p.top);
  671.             this.popIn({'startX':x,'startY':y});
  672.         }
  673.         else this.show({'noAnimation':1});
  674.  
  675.         if(dWin.winState=='minMax') dWin.winState='max'; else dWin.winState='normal';
  676.         try{if(winIF(this).winStateChanged) winIF(this).winStateChanged(prevState,dWin.winState)} catch(err){}
  677.         return;
  678.     }
  679.     // Restore from maximized
  680.     if(dWin.prevW>=ww || dWin.prevH>=wh){
  681.         x=ww/6;
  682.         y=wh/6;
  683.         w=2*ww/3;
  684.         h=2*wh/3;
  685.         if(windowsAnimation){
  686.             this.popIn({'destX':x,'destY':y,'destW':w,'destH':h})
  687.         }
  688.         else{
  689.             dWin.moveTo(x,y);
  690.             dWin.resizeTo(w,h);
  691.         }
  692.     }
  693.     // ???
  694.     else{
  695.         if(dWin.prevX+dWin.prevW>ww) x=ww-dWin.prevW; else x=dWin.prevX;
  696.         if(dWin.prevY+dWin.prevH>wh) y=wh-dWin.prevH; else y=dWin.prevY;
  697.         w=dWin.prevW;h=dWin.prevH;
  698.         if(windowsAnimation){
  699.             this.popIn({'destX':x,'destY':y,'destW':w,'destH':h})
  700.         }
  701.         else{
  702.             dWin.moveTo(x,y);
  703.             dWin.resizeTo(w,h);
  704.         }
  705.     }
  706.     dWin.nodrag=false;
  707.     if(dWin.resizable) dgi(this.id).className="win"; else dgi(this.id).className="winNR";
  708.     dgi(this.id+"_toggle").className="winMax";
  709.     dgi(this.id+"_toggle").title=winCaptionMaximize;
  710.     this.resizeMask();
  711.     dWin.winState='normal';
  712.     if(W.winMonitor) W.winMonitor(this,'restore');
  713.     try{if(winIF(this).winStateChanged) winIF(this).winStateChanged(prevState,dWin.winState);} catch(err){}
  714.     this.resized();
  715. }
  716. winObj.prototype.state = function (){return dd.elements[this.id].winState;}
  717. winObj.prototype.toggleState = function (){
  718.     if(dgi(this.id+"_toggle").className=="winToggleD") return;
  719.     var dWin=dd.elements[this.id];
  720.     if(!dWin.resizable) return;
  721.  
  722.     if(dWin.winState=='normal') {
  723.         this.maximize(this.id);
  724.         dgi(this.id+'_toggle').title=winCaptionRestore;
  725.     }
  726.     else if(dWin.winState=='max') {
  727.         this.restore(this.id);
  728.         dgi(this.id+'_toggle').title=winCaptionMaximize;
  729.     }
  730. }
  731.  
  732. /**
  733.  * Minimize window
  734.  */
  735. winObj.prototype.minimize = function (){
  736.     var dWin=dd.elements[this.id],destX,destY,p;
  737.     prevState=dWin.winState;
  738.     if(dWin.winState=='minMax' || dWin.winState=='minNormal') return;
  739.     if(dWin.winState=='max') dWin.winState='minMax'; else dWin.winState='minNormal';
  740.     dWin.prevX=dWin.x;dWin.prevY=dWin.y;dWin.prevW=dWin.w;dWin.prevH=dWin.h // Store window position for restore
  741.  
  742.     try{if(winIF(this).winStateChanged) winIF(this).winStateChanged(prevState,dWin.winState);} catch(err){}
  743.     if(W.winMonitor) W.winMonitor(this,'minimize');
  744.  
  745.  
  746.     // (animate) hide window
  747.     if(windowsAnimation) {
  748.         p=winPadding;
  749.         // Compute animation x,y target
  750.         destX=((p.right>0)?dd.getWndW()-p.right:p.left);
  751.         destY=((p.bottom>0)?dd.getWndH()-p.bottom:p.top);
  752.         this.popOut({'destX':destX,'destY':destY});
  753.     }
  754.     else dWin.hide();
  755. }
  756.  
  757. /**
  758.  * Center window on desktop
  759.  */
  760. winObj.prototype.center = function (){
  761.     var p=winPadding;
  762.     var nx=p.left/2+(dd.getWndW()-p.right - dd.elements[this.id].w)/2 + dd.getScrollX();
  763.     var ny=p.top/2+(dd.getWndH()-p.bottom - dd.elements[this.id].h)/2 + dd.getScrollY();
  764.     dd.elements[this.id].moveTo(Math.max(0,nx),Math.max(0,ny));
  765.     winLayoutModified();
  766. }
  767.  
  768. winObj.prototype.toNewWin = function (){
  769.     try{if(winIF(this).winPreReload) if(!winIF(this).winPreReload()) return;} catch(err){}
  770.     if(dgi(this.id+"_tnw").className=="winTNWD") return;
  771.  
  772.     // Get win src (forbidden on external adresses->try/catch)
  773.     var loc;try{loc=winIF(this).src;loc=winIF(this).location} catch(err){loc=dgi(this.id+'_reloadSrc').innerHTML}
  774.  
  775.     // Open new window
  776.     if(dgi(this.id+"_reloadType").innerHTML=='POST' && winIF(this).reloadPostData){
  777.         W.open(loc,this.id,'resizable=yes,scrollbars=yes,toolbar=yes,menubar=yes')
  778.         with(dgi('reloadForm')){
  779.             a.value=Math.random(999999);
  780.             reloadPostData.value=winIF(this).reloadPostData;
  781.             action=winIF(this).location;
  782.             target = this.id;
  783.             submit();
  784.             reloadPostData.value='';
  785.         }
  786.     }
  787.     else W.open(loc,this.id,'resizable=yes,scrollbars=yes,toolbar=yes,menubar=yes')
  788.     // Close current window
  789.     this.closeMe();
  790. }
  791.  
  792. winObj.prototype.setSize = function (w,h){
  793.     var dWin=dd.elements[this.id];
  794.     needCenter=false;
  795.     if(dWin.winState=='max'){
  796.         this.restore();
  797.         needCenter=true;
  798.     }
  799.     this.resizeTo(w,h);
  800.     if(needCenter) this.center();
  801. }
  802.  
  803. winObj.prototype.freezeSize = function (){
  804.     this.resizable(false);
  805.     this.fixedSize=true;
  806. }
  807. // Show/fade effect
  808. winObj.prototype.show = function (options){
  809.     if(!options) options={};
  810.     if(windowsAnimation && !options['noAnimation']) this.popIn(); else {dgi(this.id).style.display="block";dgi(this.id).style.visibility="visible";setAlpha(dgi(this.id),1)}
  811.     winLayoutModified();
  812. }
  813. winObj.prototype.hide = function (){
  814.     dgi(this.id).style.display="none";
  815.     winLayoutModified();
  816. }
  817.  
  818. // Select a window, activate mask on all other windows
  819. winObj.prototype.select = function (){
  820.     winActive=this.id;
  821.     for(var i=0; i<dd.elements.length; i++){
  822.         if(dd.elements[i].isWindow && dd.elements[i].name!=winActive){
  823.             win(dd.elements[i].name).showMask();
  824.             dgi(dd.elements[i].name+"_table").className="winInactive";
  825.         }
  826.     }
  827.     dgi(winActive+"_table").className="winActive";
  828. }
  829.  
  830. winObj.prototype.activate = function (){
  831.     var id=this.id,thisWin=win(id),thisElt=dd.elements[id];
  832.     if(thisElt.winState=='minMax' || thisElt.winState=='minNormal') this.restore();
  833.     thisWin.select();
  834.     thisWin.hideMask();
  835.     thisWin.bringToFront();
  836.     winLayoutModified();
  837.     if(W.winMonitor) W.winMonitor(this,'activate');
  838.     try{winIF(this).focus();} catch(err){}
  839. }
  840. // Return true if window is active window
  841. winObj.prototype.isActive = function (){return winActive==this.id}
  842.  
  843.  
  844. /**
  845.  * Show-window animation
  846.  * @param targetPosition: if passed, anim from current position to targetPosition{'destX':, 'destY':, 'destW':, 'destH':}
  847.  */
  848. winObj.prototype.popIn = function (targetPosition){
  849.     var el,extraParams,iFS=this.iframe().style,oiFS=this.iframe().parentNode.style;
  850.     if(!targetPosition) targetPosition={};
  851.  
  852.     // target position passed: anim from current position to targetPosition (same format than extraParams below)
  853.     if(targetPosition.targetX!==undefined || targetPosition.destW){
  854.         extraParams={'startX':this.getX(),'startY':this.getY(),
  855.                     'startW':this.getOuterWidth(),'startH':this.getOuterHeight(),
  856.                     'startIW':this.getInnerWidth(),'startIH':this.getInnerHeight()};
  857.         for(el in targetPosition) extraParams[el]=targetPosition[el];
  858.  
  859.         if(!extraParams.destIW){
  860.             extraParams.destIW=extraParams.destW-extraParams.startW+extraParams.startIW;
  861.             extraParams.destIH=extraParams.destH-extraParams.startH+extraParams.startIH;
  862.         }
  863.     }
  864.     // No passed target: animate from center of screen
  865.     else{
  866.         extraParams={
  867.             'destX':this.getX(),'destY':this.getY(),
  868.             'startW':50,'startH':50,
  869.             'destIW':this.getInnerWidth(),'destIH':this.getInnerHeight(),
  870.             'destW':this.getOuterWidth(),'destH':this.getOuterHeight(),
  871.             'fadeIn':1
  872.         }
  873.         extraParams.startX=extraParams.destX+(extraParams.destW-extraParams.startW)/2;
  874.         extraParams.startY=extraParams.destY+(extraParams.destH-extraParams.startH)/2;
  875.  
  876.         // Some parameters may be passed, as startX or startY (restore from minimized)
  877.         for(el in targetPosition) extraParams[el]=targetPosition[el];
  878.     }
  879.     // Compute start window inner width & height
  880.     if(extraParams.startIW==undefined){
  881.         extraParams.startIW=extraParams.startW-extraParams.destW+extraParams.destIW;
  882.         extraParams.startIH=extraParams.startH-extraParams.destH+extraParams.destIH;
  883.     }
  884.     // Set start position to mouse cursor if not already set
  885.     if(W.mouseX) {extraParams.startX=mouseX;extraParams.startY=mouseY-((extraParams.destY<mouseY)?50:0)}
  886.  
  887.     // Resize iframe to destination size to prevent content to be resized during animation
  888.     iFS.width=oiFS.width=extraParams.destIW+'px'; iFS.height=oiFS.height=extraParams.destIH+'px';
  889.  
  890.     dgi(this.id).style.visibility='visible'
  891.  
  892.     // Start animation
  893.     wl.anim({'item':dgi(this.id),'duration':1000,'extraParams':extraParams,'function':
  894.         function(p,anim){
  895.             var e=anim.extraParams,it=anim.item,t=win(it.id),wd=dd.elements[it.id],w,h,iF=t.iframe(),oiFS=iF.parentNode.style,iFS=iF.style;
  896.  
  897.             // Set opacity
  898.             if(e.fadeIn) setAlpha(it,Math.min(1,2*p))
  899.  
  900.             // Detect window has been resized / moved by an external event during animation => stop animating
  901.             if(e.current && ((e.current.x!=wd.x && wd.x>0) || (e.current.w!=wd.w && wd.w<dd.getWndW()-5))){
  902.                 iFS.width=iFS.height=oiFS.height=oiFS.width='100%';
  903.                 return{};
  904.             }
  905.  
  906.  
  907.             // Compute new position & size
  908.             p=wl.animFunctionUnfold2(p,anim);
  909.             w=Math.round(e.startW+p*(e.destW-e.startW));
  910.             h=Math.round(e.startH+p*(e.destH-e.startH));
  911.             x=Math.round(e.startX+p*(e.destX-e.startX));
  912.             y=Math.round(e.startY+p*(e.destY-e.startY));
  913.  
  914.             // Move & resize window object
  915.             t.moveTo(Math.max(0,x),Math.max(0,y),1);
  916.             it.style.marginLeft=Math.min(0,x)+'px';
  917.             it.style.marginTop=Math.min(0,y)+'px';
  918.             t.resizeTo(w,h,0,(p==1)?0:1);
  919.  
  920.             // Reset iframe and outer iframe div size
  921.             if(p==1){iFS.width=iFS.height=oiFS.height=oiFS.width='100%'}
  922.             // Set iframe and outer iframe div size
  923.             else if(p!=0){oiFS.width=Math.max(0,w+e.destIW-e.destW)+'px';oiFS.height=Math.max(0,h+e.destIH-e.destH)+'px'}
  924.  
  925.             // Store currently set Width coordinate to detect resize by external events during animation
  926.             anim.extraParams.current={'x':wd.x,'y':wd.y,'w':wd.w,'h':wd.h}
  927.  
  928.             return {}; // don't return any css properties to anim function as all resizes/moves have already been done
  929.         }
  930.     });
  931. }
  932. winObj.prototype.popOut = function (targetPosition,callback){
  933.     var e,iFS=this.iframe().style,oiFS=this.iframe().parentNode.style,extraParams={
  934.         'startX':this.getX(),'startY':this.getY(),
  935.         'startW':this.getOuterWidth(),'startH':this.getOuterHeight(),
  936.         'startIW':this.getInnerWidth(),'startIH':this.getInnerHeight(),
  937.         'destW':200,'destH':100
  938.     }
  939.     if(W.mouseX) {extraParams.destX=mouseX-200;extraParams.destY=mouseY}
  940.     if(targetPosition) {
  941.         for(e in targetPosition) extraParams[e]=targetPosition[e];
  942.         extraParams.target=targetPosition;
  943.     }
  944.     extraParams.destIW=extraParams.startIW;
  945.     extraParams.destIH=extraParams.startIH;
  946.  
  947.     // Resize iframe to destination size to prevent content to be resized during animation
  948.     iFS.width=extraParams.destIW+'px'; iFS.height=extraParams.destIH+'px';
  949.  
  950.     wl.anim({'item':dgi(this.id),'duration':500,'callbackComplete':callback,'extraParams':extraParams,'function':
  951.         function(p,anim){
  952.             // p: 0->1
  953.             var e=anim.extraParams,t=win(anim.item.id),oiFS=t.iframe().parentNode.style,w,h;
  954.  
  955.             setAlpha(anim.item,Math.max(0,1-2*p))
  956.             p=wl.animFunctionFold2(p);
  957.  
  958.  
  959.             // Outer window size
  960.             w=e.startW+(1-p)*(e.destW-e.startW); h=e.startH+(1-p)*(e.destH-e.startH);
  961.             if(e.destX!==undefined){
  962.                 t.resizeTo(w,h,0,1);
  963.                 t.moveTo(e.startX+(1-p)*(e.destX-e.startX),e.startY+(1-p)*(e.destY-((e.target&&e.destY>e.startY)?e.destH:0)-e.startY))
  964.             }
  965.             else t.resizeTo(e.startW+(1-p)*(e.destW-e.startW),e.startH+(1-p)*(e.destH-e.startH),1,1);
  966.  
  967.             // inner frame size
  968.             oiFS.width=Math.max(1,(w+e.startIW-e.startW))+'px';
  969.             oiFS.height=Math.max(1,(h+e.startIH-e.startH))+'px';
  970.  
  971.             return {}; // don't return any css properties to anim function as all resizes/moves have already been done
  972.         }
  973.     });
  974. }
  975.  
  976. /**
  977.  *  Windows layout
  978.  */
  979.  
  980. // Bring window to front
  981. winObj.prototype.bringToFront = function (){dd.elements[this.id].maximizeZ()}
  982.  
  983. // Send window to back
  984. winObj.prototype.sendToBack = function (){
  985.     var minZ=1000;
  986.     for(var i=0; i<dd.elements.length; i++){
  987.         if(dd.elements[i].isWindow && dd.elements[i].z<minZ) minZ=dd.elements[i].z;
  988.     }
  989.     if(dd.elements[this.id].z!=minZ) dd.elements[this.id].setZ(minZ-1);
  990. }
  991.  
  992. // Window customization
  993. winObj.prototype.setBorderless = function (){dgi(this.id).className="winNB"/*;this.maximize();*/}
  994. winObj.prototype.resetBorders = function (){this.restore();}
  995. winObj.prototype.isBorderless = function (){return dgi(this.id).className=='winNB'}
  996.  
  997. // Set iframe source
  998. winObj.prototype.setSrc= function (srcURL){dgi(this.id+"_if").src=srcURL;}
  999.  
  1000. // Set URL that will be set on iframe if user reloads page
  1001. winObj.prototype.setReloadSrc = function (srcURL){dgi(this.id+"_reloadSrc").innerHTML=srcURL;winLayoutModified();}
  1002.  
  1003. // Set ID of of opener window
  1004. winObj.prototype.setOpenerId = function (oid){dgi(this.id+"_openerId").innerHTML=oid;}
  1005. // Retreive ID of of opener window
  1006. winObj.prototype.getOpenerId = function (){return dgi(this.id+"_openerId").innerHTML;}
  1007.  
  1008. /**
  1009.  * Set window title
  1010.  * @param capt: title
  1011.  * @param serverSideUpdate: undefined or true to update server-side name of window
  1012.  */
  1013. winObj.prototype.setCaption = function (capt,serverSideUpdate){
  1014.     dgi(this.id+"_capt").innerHTML=capt;winLayoutModified();
  1015.     if((serverSideUpdate||serverSideUpdate==undefined) && W.winMonitor) winMonitor(this,'setCaption');
  1016. }
  1017. winObj.prototype.getCaption = function (){return dgi(this.id+"_capt").innerHTML;}
  1018. // Aliases for get/set caption
  1019. winObj.prototype.setTitle = function (capt,serverSideUpdate){this.setCaption(capt,serverSideUpdate)}
  1020. winObj.prototype.getTitle = function (){return this.getCaption()}
  1021.  
  1022. winObj.prototype.setIcon= function (imageURL){
  1023.     var iht;
  1024.     if(imageURL.substr(imageURL.length-4).toLowerCase=='png' && dd.ie && !dd.ie7 && !dd.ie8) {
  1025.         iht='<div style="display:inline;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\''+imageURL+'\', sizingMethod=\'scale\');width:100%;height:100%;"></div>';
  1026.     }
  1027.     else iht='<img src="'+imageURL+'" alt="" style="width:100%;height:100%;"/>';
  1028.     dgi(this.id+"_icon").innerHTML=iht;
  1029.     winLayoutModified();
  1030.     if(W.winMonitor) W.winMonitor(this,'setIcon');
  1031. }
  1032. winObj.prototype.getIcon = function (){return dgi(this.id+"_icon").innerHTML;}
  1033. winObj.prototype.setRawIcon = function (imageTag){dgi(this.id+"_icon").innerHTML=imageTag;winLayoutModified();}
  1034.  
  1035. // Return ID of resource in window
  1036. winObj.prototype.getResourceId = function (){try{return this.frame().rID} catch(e){}}
  1037.  
  1038. // Return frame object of window
  1039. winObj.prototype.frame = function (){return frames[dgi(this.id+"_if").name]}
  1040. // Return iframe node
  1041. winObj.prototype.iframe = function (){return dgi(this.id+"_if")}
  1042.  
  1043.  
  1044. winObj.prototype.setCloseFunction = function (functionName){dgi(this.id+"_closeFunction").innerHTML=functionName;}
  1045. winObj.prototype.getCloseFunction = function (){return dgi(this.id+"_closeFunction").innerHTML;}
  1046.  
  1047. winObj.prototype.closeable= function (isCloseable){
  1048.     if(isCloseable){
  1049.         dgi(this.id+"_close").className="winClose";
  1050.     }
  1051.     else if(isCloseable===false){
  1052.         dgi(this.id+"_close").className="winCloseD";
  1053.         dgi(this.id+"_icon").ondblclick="";
  1054.     }
  1055.     winLayoutModified();
  1056.     if(dgi(this.id+"_close").className=="winClose") return true; else return false;
  1057. }
  1058. winObj.prototype.resizable = function (isResizable){
  1059.     if(isResizable){
  1060.         dgi(this.id).className="win";
  1061.         if(this.winState=="max")
  1062.             dgi(this.id+"_toggle").className="winRestore";
  1063.         else
  1064.             dgi(this.id+"_toggle").className="winMax";
  1065.     }
  1066.     else if(isResizable===false) {
  1067.         dgi(this.id).className="winNR";
  1068.         dgi(this.id+"_toggle").className="winToggleD";
  1069.         dgi(this.id+"_tnw").className="winTNWD";
  1070.     }
  1071.     winLayoutModified();
  1072.     if(dgi(this.id).className=="win") return true; else return false;
  1073. }
  1074. winObj.prototype.reloadable = function (isReloadable){
  1075.     if(isReloadable){
  1076.         dgi(this.id+"_reload").className="winReload";
  1077.         dgi(this.id+"_reload").style.cursor="";
  1078.     }
  1079.     else if(isReloadable===false) {
  1080.         dgi(this.id+"_reload").className="winReloadD";
  1081.         dgi(this.id+"_reload").style.cursor="pointer";
  1082.     }
  1083.     winLayoutModified();
  1084.     if(dgi(this.id+"_reload").className=="winReload") return true; else return false;
  1085. }
  1086. winObj.prototype.moveable = function (isMoveable){
  1087.     if(isMoveable){
  1088.         dd.elements[this.id].setDraggable(true);
  1089.     }
  1090.     else if(isMoveable===false) {
  1091.         dd.elements[this.id].setDraggable(false);
  1092.     }
  1093.     winLayoutModified();
  1094.     return !dd.elements[this.id].nodrag;
  1095. }
  1096. winObj.prototype.addIcon = function (id, action, cssBackground, title){
  1097.     if(!dgi(this.id+"_extra"+id)) dgi(this.id+"_extra").innerHTML+='<a id="'+this.id+'_extra'+id+'" class="winExtraIcon"></a>'
  1098.     dgi(this.id+"_extra"+id).style.background=cssBackground;
  1099.     dgi(this.id+"_extra"+id).onclick=action;
  1100.     dgi(this.id+"_extra").style.display='inline';
  1101.     if(title) dgi(this.id+"_extra").title=title;
  1102. }
  1103. // Add extra controls in title bar
  1104. winObj.prototype.addControls = function (html){
  1105.     //if(phpBrowser!='opera') try{dgi(this.id+"_extra").innerHTML=html;}
  1106.     // IE / Opera WA
  1107.     //catch (err){
  1108.     var o=dgi(this.id+"_extra");
  1109.     var n = D.createElement("span");
  1110.     html.replace(new RegExp('href="javascript:','gi'),'href="#" onclick="'); // WA: button doesn't work if JS put in href
  1111.     n.innerHTML=html
  1112.     o.innerHTML='';    o.appendChild(n);
  1113.     //}
  1114.     dgi(this.id+"_extra").style.display='';
  1115.  
  1116.     // Call resizeMask so caption width is resized according to new _extra left border
  1117.     this.resizeMask();
  1118. }
  1119.  
  1120. winObj.prototype.getWinState = function (){return dd.elements[this.id].winState;}
  1121. winObj.prototype.setWinState = function (newState){dd.elements[this.id].winState=newState;}
  1122. winObj.prototype.isFrameless = function (){return false}
  1123. winObj.prototype.openWindow = function (url,opt){
  1124.     if(!opt) opt={};
  1125.     var w=Math.min(Math.floor(5*dd.getWndW()/6),400); if(opt['w']) w=opt['w'];
  1126.     var h=Math.min(Math.floor(5*dd.getWndH()/6),320); if(opt['h']) h=opt['h'];
  1127.     var id=opt['id']||'W'+Math.random();
  1128.     var caption=(opt['label']!==undefined)?opt['label']:' ';
  1129.     winOpenLocation(url,id,this.id);
  1130.     with(win(id)){
  1131.         resizeInnerTo(w,h);
  1132.         center();
  1133.         if(opt['icon']) setIcon(opt['icon']);
  1134.         if(opt['caption']) setCaption(opt['caption']);
  1135.         show();
  1136.         bringToFront();
  1137.     }
  1138.     return win(id);
  1139. }
  1140. // Sync Reload whole desktop
  1141. winObj.prototype.reloadDesktop = function (){var URL=D.location.href;if(URL.indexOf('?')>0) URL=URL.substr(0,URL.indexOf('?'));wl.goURL(URL)}